﻿using System;
using System.Reflection;

namespace Scommesse.Utility
{
    // Questo attributo è usato per rappresentare un valore string per un valore di un enum
    [Serializable]
    public class StringValueAttribute : Attribute
    {
        #region Properties

        // Contiene il valore string per un valore di un enum
        public string StringValue { get; protected set; }

        #endregion

        #region Constructor

        // Costruttore usato per inizializzare un attributo StringValue
        public StringValueAttribute(string value)
        {
            StringValue = value;
        }

        #endregion

        public static string GetStringValue(Enum value)
        {
            // Ottieni il tipo di Enum
            Type type = value.GetType();

            // Ottieni le fieldInfo per questo tipo
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Ottieni l'attributo StringValueAttribute
            var attr = (StringValueAttribute) fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false)[0];
            
            // Restituisci l'attributo sotto forma di stringa
            return attr.StringValue;
        }

        public static T GetEnumByStringValueAttribute<T>(string value)
        {
            // Ottieni il tipo di Enum
            Type enumType = typeof(T);

            // Per ogni valore dell'enumerativo confronta sia il nome del campo, che l'attributo StringValue con la stringa cercata
            // Se corrisponde restituisci l'enumerativo del valore cercato
            foreach (Enum val in Enum.GetValues(enumType))
            {
                FieldInfo fieldInfo = enumType.GetField(val.ToString());
                StringValueAttribute attr = (StringValueAttribute) fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false)[0];
                if (attr.StringValue != null && attr.StringValue == value)
                    return (T) fieldInfo.GetValue(null);
                if (fieldInfo.Name == value)
                    return (T) fieldInfo.GetValue(null);
            }
            // Se non trova alcuna corrispondenza, genera eccezione
            throw new ArgumentException("Il valore '" + value + "' non è supportato.");
        }
    }
}